home *** CD-ROM | disk | FTP | other *** search
/ Fifty: Elektronik / FIFTY Elektronik (PS_Computer_Vertrieb).iso / ps8 / fty1017 / gepackt.exe / DISK2 / PLOTSRC.EXE / PLOTSYS.INC < prev    next >
Encoding:
Text File  |  1993-11-10  |  13.4 KB  |  586 lines

  1.  
  2. Procedure ErrorInit;
  3. Begin
  4.   GotoXY(1,25);ClrEol;Beep;
  5. End;
  6.  
  7. Const  FehlerCode :Integer=0;
  8.  
  9. procedure error(ErrCode:integer);
  10. Begin
  11.    FehlerCode:=ErrCode;
  12.    Halt(ErrCode+100);
  13. End;
  14.  
  15. procedure errorMSG;
  16. Begin
  17.   If FehlerCode<>0 then
  18.   begin
  19.     Writeln;
  20.     Writeln;
  21.     Case Fehlercode Of
  22.       3 : With SetupInfo do
  23.            Write('Zeichensatz ',Zeichensatz1,' und ',Zeichensatz2,' nicht gefunden');
  24.       6 : Write('nicht genug Speicher');
  25.       7 : Write('Schwerer Disk-Fehler');
  26.       9 : Write('GED.INF nicht gefunden');
  27.       11: Write('GED.FIL nicht gefunden ');
  28.       12: Write('Programmpfad ungültig');
  29.       13: Write('Zeichnungs-/Macro-Pfad ungültig');
  30.       100:Write('Ungültige Parameter');
  31.       101:Write('Plotformat nicht gefunden');
  32.       102:Write('MACRO nicht gefunden');
  33.       103:Write('Zeichnung nicht gefunden');
  34.       104:Write('Datei-Zugriffsfehler');
  35.       110:Write('interner Fehler in ID-Tabelle');
  36.         Else Write('Unbekannter Fehler');
  37.     End;
  38.     Writeln;
  39.     If Not(Batch) then
  40.      begin
  41.        Writeln('Weiter : Irgendeine Taste !');
  42.        WaitonKey;
  43.      end;
  44.    end;
  45. End;
  46.  
  47. Procedure Normalize(Var Phi :Integer);
  48. begin
  49.   Phi:=Phi mod 360;
  50.   If Phi <0 Then Inc(Phi,360);
  51. end;
  52.  
  53.  
  54. Procedure SinusCosinus(Phi :integer; Var Si,Co :Real);
  55. (*Bestimmt Sinus und Cosinus aus Tabelle, Phi in ganzen Grad*)
  56.  
  57. Begin
  58.   Normalize(Phi);
  59.   If Phi<90 Then
  60.     Begin
  61.       Co:=GrSinus[90-Phi];
  62.       Si:=GrSinus[Phi];
  63.      End
  64.   Else
  65.     If Phi<180 Then
  66.       Begin
  67.         Co:=-GrSinus[Phi-90];
  68.         Si:=GrSinus[180-Phi];
  69.       End
  70.     Else
  71.       If Phi<270 Then
  72.         Begin
  73.           Co:=-GrSinus[270-Phi];
  74.           Si:=-GrSinus[Phi-180];
  75.          End
  76.       Else
  77.          Begin
  78.           Co:=GrSinus[Phi-270];
  79.           Si:=-GrSinus[360-Phi];
  80.         End;
  81. End;
  82.  
  83.  
  84. Procedure CircleCoord(RX,RY,Phi :Integer  ;Var CX,CY :Real);
  85. (*bestimmt PolarKoord. auf einer Ellipse (RX,RY) *)
  86.  
  87. Var Si,Co       :Real;
  88. Begin
  89.   SinusCosinus(Phi,Si,Co);
  90.   CX:=RX*Co;
  91.   CY:=RY*Si;
  92. End;
  93.  
  94.  
  95. Procedure Turnto(Phi :Integer);
  96. (*Initialisiert Drehmatrix gemäß Phi *)
  97.  
  98. Var Si,Co   :Real;
  99. Begin
  100.   Normalize(Phi);
  101.   If Not(Phi=GrRotPhi) Then
  102.   Begin
  103.     SinusCosinus(Phi,Si,Co);
  104.     GrRotPhi:= Phi;
  105.     GrRot11:=Co;GrRot22:=GrRot11;
  106.     GrRot21:=Si;GrRot12:=-GrRot21;
  107.   End;
  108. End;
  109.  
  110.  
  111. Procedure Rotreal(Var X,Y :Real);
  112. (*Rotiert X,Y um durch Turnto festgelegten Winkel Phi *)
  113.  
  114. Var Xneu,Yneu :Real;
  115. Begin
  116.   Case GrRotPhi Of
  117.     0,360 : Begin
  118.              Xneu:=X;
  119.              Yneu:=Y;
  120.            End;
  121.     90   : Begin
  122.              Xneu:=-Y;
  123.              Yneu:=X;
  124.            End;
  125.     180  : Begin
  126.              Xneu:=-X;
  127.              Yneu:=-Y;
  128.            End;
  129.     270  : Begin
  130.              Xneu:=Y;
  131.              Yneu:=-X;
  132.            End;
  133.     Else
  134.          Begin
  135.            Xneu:=GrRot11*X+GrRot12*Y;
  136.            Yneu:=GrRot21*X+GrRot22*Y;
  137.          End;
  138.   End;
  139.   X:=Xneu;
  140.   Y:=Yneu;
  141. End;
  142.  
  143.  
  144. Procedure Rotate(Var X,Y :Integer);
  145.  
  146. Var Xneu,Yneu :Integer;
  147. (*Rotiert X,Y um durch Turnto festgelegten Winkel Phi *)
  148. Begin
  149.   Case GrRotPhi Of
  150.     0,360 : Begin
  151.              Xneu:=X;
  152.              Yneu:=Y;
  153.            End;
  154.     90   : Begin
  155.              Xneu:=-Y;
  156.              Yneu:=X;
  157.            End;
  158.     180  : Begin
  159.              Xneu:=-X;
  160.              Yneu:=-Y;
  161.            End;
  162.     270  : Begin
  163.              Xneu:=Y;
  164.              Yneu:=-X;
  165.            End;
  166.     Else
  167.          Begin
  168.            Xneu:=RealToInt(GrRot11*X+GrRot12*Y);
  169.            Yneu:=RealToInt(GrRot21*X+GrRot22*Y);
  170.          End;
  171.   End;
  172.   X:=Xneu;
  173.   Y:=Yneu;
  174. End;
  175.  
  176.  
  177. Function PlotKoord(X:Real):Real;
  178. (*Bestimmt Potterkoordinate aus Zeichnungskoordinate in mm*)
  179.  
  180. begin
  181.   PlotKoord:=X*InvPlotRes;
  182. end;
  183.  
  184.  
  185. Function Ungleich(A,B:Real):Boolean;
  186. (*Prüft Gleichheit zweier Zeichnungskoordinaten*)
  187.  
  188. begin
  189.   Ungleich:=Abs(A-B)>=PlotRes;
  190. end;
  191.  
  192.  
  193. Function PlotLimit(X:Real):Real;
  194. (*Begrenzt Maß auf >= Plotterauflösung*)
  195.  
  196. begin
  197.   If X<PlotRes Then
  198.     PlotLimit:=PlotRes
  199.   else
  200.     PlotLimit:=X;
  201. end;
  202.  
  203.  
  204.  
  205. Function CalcPhi(X,Y :Real):Integer;
  206. (*bestimmt Winkel aus X,Y (arctan) *)
  207.   
  208. Var Phi:Integer;
  209.   Begin
  210.     If (X=0) and (Y=0) Then
  211.       Phi:=0
  212.     Else
  213.     If X=0 Then
  214.       If Y>0 Then Phi:=90 Else Phi:=-90
  215.     Else
  216.      Phi:=RealToInt(ArcTan(Y/X)*180/Pi);
  217.     If X<0 Then Phi:=180+Phi
  218.       Else Normalize(Phi);
  219.     CalcPhi:=Phi;
  220.   End;
  221.  
  222.  
  223. Procedure GrafWindow(X1,Y1,X2,Y2 :Integer);
  224. (* legt Plotterausgabefenster fest *)
  225.   
  226. Var ExChange  :Integer;
  227. Begin
  228.   With SetupInfo.SetUpPlotter do
  229.   begin
  230.     If X1>X2  Then Begin Exchange:=X2;X2:=X1;X1:=Exchange; End;
  231.     If X1<MinFormX Then X1:=MinFormX;
  232.     If X2>FormX Then X2:=FormX;
  233.     If Y1>Y2  Then Begin Exchange:=Y2;Y2:=Y1;Y1:=Exchange; End;
  234.     If Y1<MinFormY  Then Y1:=MinFormY;
  235.     If Y2>FormY Then Y2:=FormY;
  236.   end;
  237.   GrWindowX1:=PlotKoord(X1);GrWindowX2:=PlotKoord(X2);
  238.   GrWindowY1:=PlotKoord(Y1);GrWindowY2:=PlotKoord(Y2);
  239. End;
  240.  
  241.  
  242.  
  243. Procedure WhichField(X,Y :Real;Var WoX,WoY :Integer);
  244. (* wird für Clip-Funktion (Randabschneiden) benötigt  *)
  245.  
  246. Begin
  247.   WoX:=0;WoY:=0;
  248.   If X>GrWindowX2 Then WoX:=1;
  249.   If X<GrWindowX1 Then WoX:=-1;
  250.   If Y>GrWindowY2 Then WoY:=1;
  251.   If Y<GrWindowY1 Then WoY:=-1;
  252. End;
  253.  
  254.  
  255. Function InWindow(X,Y :Real) :Boolean;
  256. (* Prüft ob Punkt im Ausgabe-Fenster *)
  257.  
  258. Begin
  259.    Inwindow:=false;
  260.    If (X>=GrWindowX1) then
  261.      If (X<=GrWindowX2) then
  262.        If (Y<=GrWindowY2) then
  263.          If (Y>=GrWindowY1) then Inwindow:=true;
  264. End;
  265.  
  266.  
  267.  
  268. Function Clip(Var X1,Y1,X2,Y2: Real ):Boolean;
  269. (* schneidet Gerade X1,Y1,X2,Y2 an den Rändern des Ausgabefensters ab *)
  270. (* oder meldet wenn Gerade nicht gezeichnet werden muß (Clip=false )  *)
  271.  
  272. Var X1d,X2d,Y1d,Y2d,CutX,CutY :Real;
  273.     WoX1,WoY1,WoX2,WoY2 :Integer;
  274. Begin
  275.   X1d:=X1;X2d:=X2;
  276.   Y1d:=Y1;Y2d:=Y2;{Annahme Punkte im Fenster}
  277.   WhichField(X1d,Y1d,WoX1,WoY1);
  278.   WhichField(X2d,Y2d,WoX2,WoY2);
  279.   If ((WoX1=WoX2) and (WoX1<>0)) or ((WoY1=WoY2) and (WoY1<>0))
  280.     Then {Beide Punkte auf der selben Seite ausserhalb}
  281.       Clip:=false
  282.   Else
  283.    Begin
  284.     If WoX1<>0 Then {Punkt1 ausserhalb X-Seite}
  285.       Begin
  286.         If WoX1=1  Then CutX:=GrwindowX2;
  287.         If WoX1=-1 Then CutX:=GrWindowX1;
  288.         Y1d:=Y1d+(Y2-Y1)/(X2-X1)*(CutX-X1d);
  289.         X1d:=CutX;
  290.         WhichField(X1d,Y1d,WoX1,WoY1);
  291.       End;
  292.     If WoY1<>0 Then {Punkt 1 ausserhalb Y-Seite}
  293.       Begin
  294.         If WoY1=1  Then CutY:=GrwindowY2;
  295.         If WoY1=-1 Then CutY:=GrWindowY1;
  296.         X1d:=X1d+(X2-X1)/(Y2-Y1)*(CutY-Y1d);
  297.         Y1d:=CutY;
  298.         WhichField(X1d,Y1d,WoX1,WoY1);
  299.       End;
  300.     If WoX2<>0 Then {Punkt2 ausserhalb X-Seite}
  301.       Begin
  302.         If WoX2=1  Then CutX:=GrwindowX2;
  303.         If WoX2=-1 Then CutX:=GrWindowX1;
  304.         Y2d:=Y1d+(Y2-Y1)/(X2-X1)*(CutX-X1d);
  305.         X2d:=CutX;
  306.         WhichField(X2d,Y2d,WoX2,WoY2);
  307.       End;
  308.     If WoY2<>0 Then {Punkt 2 ausserhalb Y-Seite}
  309.       Begin
  310.         If WoY2=1  Then CutY:=GrwindowY2;
  311.         If WoY2=-1 Then CutY:=GrWindowY1;
  312.         X2d:=X1d+(X2-X1)/(Y2-Y1)*(CutY-Y1d);
  313.         Y2d:=CutY;
  314.         WhichField(X2d,Y2d,WoX2,WoY2);
  315.       End;
  316.     Clip:=(WoX1 or WoY1 or WoX2 or WoY2)=0;
  317.     X1:=X1d;X2:=X2d;
  318.     Y1:=Y1d;Y2:=Y2d;
  319.    End;
  320. End;
  321.  
  322. Procedure  FreeChMem(Var Index :ChIPtr;Var Chars :ChFPtr);
  323. begin
  324.   If Index<>nil then
  325.     begin
  326.       FreeMem(Chars,ChInfo(index^).Size);
  327.       Dispose(Index);
  328.       Index:=nil;
  329.       Chars:=nil;
  330.     end;
  331. end;
  332.  
  333. Procedure GetCharsetNames(BildDatei :PathStr);
  334. Const NrtoRead=25;  { ca. 1K }
  335. Var F:File;
  336.     BldBuffer:Array[1..NrToRead] of Bildelement;
  337.     FileVersion,
  338.     Dummy,Nread:Word;
  339.     Count,I    :Word;
  340. begin
  341.   {$I-}
  342.   Assign(F,BildDatei);
  343.   Reset(F,Sizeof(Bildelement));
  344.   If IoResult=0 then
  345.     begin
  346.       BlockRead(F,BldBuffer,NrtoRead,Nread);
  347.       If (IoResult=0) and (Nread>5) then
  348.        begin
  349.          FileVersion:=Defaults(BldBuffer[1]).GEDVersion and $7FF;
  350.          If FileVersion>VersionCode+$10 then FileVersion:=0;
  351.          { Datei wesentlich neuer als Zeichnungseditor muß Schmarrn sein !}
  352.          SetOldGeddyVersion(FileVersion<$0510);
  353.          If FileVersion>=$0510 then
  354.          begin
  355.            Count:=0;
  356.            For I:=2  to Nread do
  357.              With Ed_InfoTyp(BldBuffer[I]) do
  358.                begin
  359.                  If ElementTyp=ED_Info then
  360.                    if Typ=FontInfo then
  361.                      if Count<2 then
  362.                        begin
  363.                          Inc(Count);
  364.                          If FileExists(SearchFile(FontName)) then
  365.                           begin
  366.                             Case Count of
  367.                               1:SetupInfo.Zeichensatz1:=FontName;
  368.                               2:SetupInfo.Zeichensatz2:=FontName;
  369.                             end; { Case }
  370.                           end; {If FileExists }
  371.                        end; { If }
  372.                end; { With }
  373.          end; { If FileVersion }
  374.        end; { Ioresult = 0  }
  375.     end;
  376.   close(F);
  377.   Dummy:=Ioresult;
  378.   {$i+}
  379. end;
  380.  
  381. Procedure  FreeCharMem;
  382. begin
  383.   If CharIndex1=Charindex2  then
  384.      CharIndex2:=nil;
  385.   FreeChMem(CharIndex2,GrafSet2);
  386.   FreeChMem(CharIndex1,GrafSet1);
  387. end;
  388.  
  389. Procedure GetIndex(Var Index :Chindex;Var Chars :Chfeld);
  390.   Var I,Start:Integer;
  391.   begin
  392.     Start:=0;
  393.     For I:=0 to 223 do
  394.     begin
  395.       Index[I]:=Start;
  396.       Start:=Start+Chars[Start].CharY;
  397.     end;
  398.   end;
  399.  
  400. Function Zeichensatz_lesen(Var Index :ChIPtr;Var Chars :ChFPtr;
  401.                              ChName :Str15):Word;
  402. { 0= Ok, 1 = File Not Found , 2 = No Memory, 3 Anderer Fehler }
  403.   Var Fil       :File;
  404.       BufSize,N,
  405.       Nread,I   :Word;
  406.       Ok        :Word;
  407. Begin
  408.   Zeichensatz_lesen:=1;
  409.   If ChName<>'' then
  410.   begin
  411.     Assign(Fil,SearchFile(ChName));
  412.     (*$I-*)
  413.     Reset(fil,1);
  414.     If IOResult=0 Then
  415.       Begin
  416.         Ok:=0;
  417.         N:=FileSize(Fil);
  418.         If Ioresult<>0 then
  419.           Ok:=1;
  420.         BufSize:=N;
  421.         Index:=nil;
  422.         If MaxAvail>BufSize+Sizeof(ChIndex) then
  423.           begin
  424.             GetMem(Chars,Bufsize);
  425.             New(Index);
  426.             ChInfo(Index^).Size:=BufSize;
  427.           end else Ok:=2;
  428.         If Ok=0 then
  429.           begin
  430.             BlockRead(fil,Chars^,N,Nread);
  431.             If (Ioresult<>0) or (N<>Nread) then Ok:=1;
  432.             GetIndex(Index^,Chars^);
  433.           end;
  434.         Close(fil);
  435.         I:=Ioresult;
  436.         (*$I+*)
  437.         If (Ok<>0) and (Index<>nil) then
  438.           begin
  439.             Dispose(Index);
  440.             FreeMem(Chars,BufSize);
  441.             Chars:=nil;
  442.             Index:=nil;
  443.           end;
  444.         Zeichensatz_lesen:=Ok;
  445.       end; {Ioresult=0}
  446.   End; {ChName<>''}
  447. end;
  448.  
  449. Function CharSetInit:Word;
  450. Var R1,R2 :Integer;
  451.  { Result =0 :Fehler;
  452.    Result =1 :Z-Satz1 Ok
  453.    Result =2 :Z-Satz2 Ok
  454.    Result =3 :Z-Satz1 + Z-Satz2 Ok }
  455.  
  456. begin
  457.   GrafSet1:=nil;
  458.   Grafset2:=nil;
  459.   CharIndex1:=nil;
  460.   CharIndex2:=nil;
  461.   CharsetInit:=0;;
  462.   R1:=Zeichensatz_lesen(CharIndex1,Grafset1,SetupInfo.Zeichensatz1);
  463.   R2:=Zeichensatz_lesen(CharIndex2,Grafset2,SetupInfo.Zeichensatz2);
  464.   If (R1=0) and (R2<>0) then
  465.     begin
  466.       CharIndex2:=CharIndex1;
  467.       Grafset2:=Grafset1;
  468.       CharsetInit:=1;
  469.     end;
  470.   If (R1<>0) and (R2=0) then
  471.     begin
  472.       CharIndex1:=CharIndex2;
  473.       Grafset1:=Grafset2;
  474.       CharsetInit:=2;
  475.     end;
  476.   If (R1=0) and (R2=0) then
  477.       CharsetInit:=3;
  478. end;
  479.  
  480. Procedure ReInitCharset;
  481. begin
  482.   SetupInfo.Zeichensatz2:=Setupinfo.Zeichensatz4;
  483.   SetupInfo.Zeichensatz1:=Setupinfo.Zeichensatz3;
  484.   FreeCharMem;
  485.   If CharsetInit=0 then Error(3);
  486. end;
  487.  
  488.  
  489.  
  490. procedure PlotSysInit;
  491.  
  492. var i:integer;
  493. begin
  494.     GotoXY(1,1);
  495.     For i:=0 to 90 Do  (* Initialisierung der Sinustabelle *)
  496.       GrSinus[i]:=Sin(Pi/180*i);
  497.     Turnto(0);
  498.     If CharsetInit=0 then Error(3);
  499.     If Maxavail<32768 then Error(6);
  500.     Auto_ClrInp:=Not(SetupInfo.Input_NoClear);
  501. end;
  502.  
  503. Procedure  LoadSetup;
  504. Var SetupFile  :File of Setup;
  505.     I,Col :Integer;
  506. begin
  507.   assign(Setupfile,SetupF);
  508.   {$I-} reset(SetupFile); {$I+}
  509.   if IOResult=0 then
  510.     begin
  511.       read(SetupFile,Setupinfo);
  512.       close(Setupfile);
  513.     end
  514.      else Error(9);
  515.   With SetupInfo.SetUpPlotter do
  516.   begin
  517.     If FormX<0 Then MinFormX:=FormX else MinFormX:=0;
  518.     FormX:=Abs(FormX);
  519.     If FormY<0 Then MinFormY:=FormY else MinFormY:=0;
  520.     FormY:=Abs(FormY);
  521.   end;
  522. end;
  523.  
  524. Procedure  LoadFileSetup;
  525. Var SetupFile  :File of FileInf;
  526. begin
  527.   assign(Setupfile,FSetupF);
  528.   {$I-} reset(SetupFile); {$I+}
  529.   if IOResult=0 then
  530.     begin
  531.       read(SetupFile,FileSetup);
  532.       close(Setupfile);
  533.     end
  534.      else Error(11);
  535. end;
  536.  
  537. Procedure  CheckPath(Var P :PathStr);
  538.   begin
  539.     if Not PathExists(P) then
  540.         Error(13);
  541.   end;
  542.  
  543. Procedure CheckDirs;
  544. Begin
  545.   With FileSetup Do
  546.   Begin
  547.     Activepath:=DWGPath;
  548.     Macropath:=LibPath;
  549.     CheckPath(ActivePath);
  550.     CheckPath(MacroPath);
  551.     DirMask:='*.*';
  552.    End;
  553. End;
  554.  
  555. procedure NormVideo;
  556.   begin
  557.     If ModeCO80 then Crt.TextColor(Crt.Yellow)
  558.     else
  559.       Crt.TextColor(Crt.White);
  560.   end;
  561.  
  562. procedure LowVideo;
  563.   begin
  564.     If ModeCO80 then Crt.TextColor(Crt.Cyan)
  565.     else
  566.       Crt.TextColor(Crt.Lightgray);
  567.   end;
  568.  
  569. Procedure InitCharNames;
  570. Var Pa  :PathStr;
  571.     Na  :NameStr;
  572.     Ex  :ExtStr;
  573. begin
  574.   If Batch then
  575.     begin
  576.       Fsplit(ParamStr(1),Pa,Na,Ex);
  577.       Pa:=Pa+Na+Dsuf;
  578.     end
  579.   else
  580.    begin
  581.      Pa:=Filesetup.DWG+Dsuf;
  582.      ProcessFilename(Filesetup.DWGPath,Pa);
  583.    end;
  584.   GetCharsetNames(Pa);
  585. end;
  586.